////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017-2018 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// THIS IS AUTO-GENERATED CODE.  PLEASE DO NOT EDIT (File bug reports against tools).
///
/// Auto-generated by: ParameterParser V1.1.4
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  aecextension.h
/// @brief Auto-generated Chromatix parameter file
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef AECEXTENSION_H
#define AECEXTENSION_H

#include "parametermodule.h"
#include "parameterfilesymboltable.h"
#include "parametertypes.h"
#include "globalelements.h"
#include "aecglobalelements.h"

#define AECEXTENSION_NAMESPACE_BEGIN namespace aecExtension {
#define AECEXTENSION_NAMESPACE_END }

AECEXTENSION_NAMESPACE_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// DualCamCCTExpCompType
///
/// Description:   CCT-based adjustments to make dual camera exposures similar
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct DualCamCCTExpCompType
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CCT
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   CCT index threshold for ratio adjust
    /// Range:         [2000,10000]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    INT32 CCT;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// compensationRatio
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Ratio to compensate slave camera exposure based on CCT index
    /// Range:         [0.0,2.0]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FLOAT compensationRatio;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// DualCamType
///
/// Description:   Dual Camera tuning minimizes exposure discrepancies between two cameras
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct DualCamType
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// enableDualCamExpComp
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   This feature will compensate exposure between two sensors based on color temperature
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BOOL                   enableDualCamExpComp;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// dualCamExpCompMultiplier
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Base multiplier for slave exposure
    /// Range:         [0.5,2.0]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FLOAT                  dualCamExpCompMultiplier;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CCTBasedExpComp - Array
    ///
    /// Description:   CCT-based adjustments to make dual camera exposures similar
    /// Min Length:    1
    /// Max Length:    Unbounded
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32                 CCTBasedExpCompCount;
    UINT32                 CCTBasedExpCompID;
    DualCamCCTExpCompType* CCTBasedExpComp;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// TouchEVSceneChangeType
///
/// Description:   Touch EV Scene Monitor will reset the touch ROI if a scene change is detected
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct TouchEVSceneChangeType
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// enableTouchEVScnDet
    ///
    /// Tuning Level:  often_tune
    /// Description:   This feature will reset touch AEC ROI when a scene change is detected
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BOOL  enableTouchEVScnDet;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// thresLumaDelta
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Scene change is detected if the absolute luma delta between previous and current frame is larger than
    ///                this threshold
    /// Range:         [0,32]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    INT32 thresLumaDelta;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// thresLumaAvgPct
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Scene detection in low light will be triggered if deviation exceeds temporally averaged luma multiplied
    ///                by this factor; the smaller the value the more scene change will trigger
    /// Range:         [0.02,0.1]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FLOAT thresLumaAvgPct;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// minLumaAvg
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Scene detection will trigger if the difference between cur luma and temporally averaged luma differ by
    ///                more than this threshold
    /// Range:         [5,20]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FLOAT minLumaAvg;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// frameDelayBeforeStable
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Number of frames luma needs to be stable for the algorithm to begin monitoring
    /// Range:         [2,10]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    INT32 frameDelayBeforeStable;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// temporalLumaAverageCount
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   How many frames to use in temporal average computation
    /// Range:         [5,20]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    INT32 temporalLumaAverageCount;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// YHistStretchZoneDataType
///
/// Description:   Y histogram parameters adjusted by triggers
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct YHistStretchZoneDataType
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// darkBinThres
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Desired percentage of dark pixels; upper limit
    /// Range:         [0.0,0.05]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FLOAT darkBinThres;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// darkBinThresLow
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Desired percentage of dark pixels; lower limit
    /// Range:         [0.0,0.05]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FLOAT darkBinThresLow;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// satBinThres
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Desired percentage of bright pixels; upper limit
    /// Range:         [0.92,1.0]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FLOAT satBinThres;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// satBinThresLow
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Desired percentage of bright pixels; lower limit
    /// Range:         [0.92,1.0]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FLOAT satBinThresLow;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// darkTargetLvL
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Target average value for dark pixels
    /// Range:         [0,5]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    INT32 darkTargetLvL;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// satTargetLvL
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Target average value for bright pixels
    /// Range:         [210,255]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    INT32 satTargetLvL;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// satScalingMax
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Maximum Y stretching
    /// Range:         [1.0,1.3]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FLOAT satScalingMax;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// darkClampingMax
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Maximum amount of clamping adjustment on the dark end of the histogram
    /// Range:         [0,16]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    INT32 darkClampingMax;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// YHistStretchZoneType
///
/// Description:   Triggers for Y histogram stretch parameters
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct YHistStretchZoneType
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// zoneTrigger
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Lux range to define one trigger zone for Y histogram stretch
    /// Range:         [0,500]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    aecglobalelements::TriggerPointType         zoneTrigger;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// zoneData
    ///
    /// Description:   Y histogram parameters adjusted by triggers
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    YHistStretchZoneDataType zoneData;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// YHistStretchType
///
/// Description:   Y histogram stretch improves contrast by stretching histogram so that some pixels are shifted to dark and
///                bright histogram ends
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct YHistStretchType
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// enableYHistStretch
    ///
    /// Tuning Level:  often_tune
    /// Description:   This feature increases contrast based on Y histogram data
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BOOL                  enableYHistStretch;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// tempFilter
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Temporal filtering of clamp and scale adjustments. The smaller the value, the more temporal filtering
    /// Range:         [0.1,1.0]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FLOAT                 tempFilter;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// yHistStretchZone - Array
    ///
    /// Description:   Triggers for Y histogram stretch parameters
    /// Min Length:    1
    /// Max Length:    Unbounded
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32                yHistStretchZoneCount;
    UINT32                yHistStretchZoneID;
    YHistStretchZoneType* yHistStretchZone;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// AECCoreExtensionType
///
/// Description:   Extension Module contains peripheral algorithms
/// Comments:       Core Extension Tuning Definition
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct AECCoreExtensionType
{
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Binary file symbol table entry ID
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32 SymbolTableID;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// module_version
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    struct module_versionStruct
    {
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Binary file symbol table entry ID
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        UINT32 SymbolTableID;
        INT32 major_revision;
        INT32 minor_revision;
        INT32 incr_revision;
    } module_version;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// YHistStretch
    ///
    /// Description:   Y histogram stretch improves contrast by stretching histogram so that some pixels are shifted to dark and
    ///                bright histogram ends
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    YHistStretchType       YHistStretch;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// touchEVScnMonitor
    ///
    /// Description:   Touch EV Scene Monitor will reset the touch ROI if a scene change is detected
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    TouchEVSceneChangeType touchEVScnMonitor;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// dualCam
    ///
    /// Description:   Dual Camera tuning minimizes exposure discrepancies between two cameras
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    DualCamType            dualCam;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// enableLVTest
    ///
    /// Tuning Level:  never_tune
    /// Description:   Reserved for internal usage only.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BOOL                   enableLVTest;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// AECCoreExtensionTypeClass
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class AECCoreExtensionTypeClass : public ParameterModule, public AECCoreExtensionType
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Version
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static const UINT16 MAJOR = 1;
    static const UINT16 MINOR = 0;
    static const UINT32 PATCH = 0;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Default Constructor
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    AECCoreExtensionTypeClass(
        const CHAR* name);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Constructor
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    AECCoreExtensionTypeClass(
        const CHAR* name,
        UINT32 modeId,
        UINT16 mode,
        UINT16 subMode,
        UINT32 group);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Destructor
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~AECCoreExtensionTypeClass();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetName
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static const CHAR* GetName(
        const CHAR* type);


    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load DualCamCCTExpCompType
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadDualCamCCTExpCompType(
        ParameterFileSymbolTableEntry* entry,
        DualCamCCTExpCompType* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load DualCamType
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadDualCamType(
        ParameterFileSymbolTableEntry* entry,
        DualCamType* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load TouchEVSceneChangeType
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadTouchEVSceneChangeType(
        ParameterFileSymbolTableEntry* entry,
        TouchEVSceneChangeType* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load YHistStretchZoneDataType
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadYHistStretchZoneDataType(
        ParameterFileSymbolTableEntry* entry,
        YHistStretchZoneDataType* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load YHistStretchZoneType
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadYHistStretchZoneType(
        ParameterFileSymbolTableEntry* entry,
        YHistStretchZoneType* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load YHistStretchType
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadYHistStretchType(
        ParameterFileSymbolTableEntry* entry,
        YHistStretchType* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load AECCoreExtensionType
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadAECCoreExtensionType(
        ParameterFileSymbolTableEntry* entry,
        AECCoreExtensionType* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load module_versionStruct
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL Loadmodule_versionStruct(
        ParameterFileSymbolTableEntry* entry,
        AECCoreExtensionType::module_versionStruct* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Unload DualCamType
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static void UnloadDualCamType(
        DualCamType* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Unload YHistStretchType
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static void UnloadYHistStretchType(
        YHistStretchType* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Unload AECCoreExtensionType
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static void UnloadAECCoreExtensionType(
        AECCoreExtensionType* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Parse symbol table entry, and return a new object
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ParameterModule* Parse(
        ParameterSetManager* manager,
        ParameterFileSymbolTableEntry* entry) const;

}; // End class AECCoreExtensionTypeClass

AECEXTENSION_NAMESPACE_END
#endif // AECEXTENSION_H

